#ifndef RENDERTHREAD_H
#define RENDERTHREAD_H

#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QTimer>
#include <QPixmap>
#include <QPainter>
#include <QPainterPath>
#include <QImage>
#include <QSize>
#include <QDateTime>
#include <QPointF>
#include <QList>
#include "gamestateprocessor.h"

/**
 * @brief 渲染缓存数据
 */
struct RenderCache {
    QPixmap gameFrame;              // 游戏画面
    QSize frameSize;                // 画面尺寸
    qint64 timestamp = 0;           // 渲染时间戳
    bool isValid = false;           // 是否有效
    int fps = 0;                    // 当前FPS
};

/**
 * @brief 渲染线程
 * 专门负责游戏画面渲染，与主线程分离
 */
class RenderThread : public QObject
{
    Q_OBJECT

public:
    explicit RenderThread(QObject *parent = nullptr);
    ~RenderThread();

    /**
     * @brief 启动渲染线程
     */
    void start();

    /**
     * @brief 停止渲染线程
     */
    void stop();

    /**
     * @brief 设置线程优先级
     */
    void setPriority(QThread::Priority priority);

    /**
     * @brief 设置渲染区域大小
     * @param size 渲染区域尺寸
     */
    void setRenderSize(const QSize &size);

    /**
     * @brief 更新渲染数据
     * @param data 渲染就绪数据
     */
    void updateRenderData(const RenderReadyGameData &data);

    /**
     * @brief 线程安全获取当前数据快照（用于调试）
     */
    RenderReadyGameData getCurrentDataSnapshot() const;

    /**
     * @brief 强制立即渲染（首帧落账）
     */
    void forceImmediateRender();

    /**
     * @brief 获取最新渲染缓存
     * @return 渲染缓存
     */
    RenderCache getLatestFrame();

    /**
     * @brief 是否正在运行
     */
    bool isRunning() const { return m_running; }

    /**
     * @brief 获取当前FPS
     */
    int getCurrentFPS() const { return m_currentFPS; }

signals:
    /**
     * @brief 新帧就绪信号
     * @param frame 渲染好的帧
     */
    void frameReady(const QPixmap &frame);

    /**
     * @brief FPS更新信号
     * @param fps 当前FPS
     */
    void fpsUpdated(int fps);

    /**
     * @brief 渲染统计信号
     * @param renderTime 渲染时间(ms)
     * @param frameCount 帧数
     */
    void renderStats(int renderTime, int frameCount);

public slots:
    /**
     * @brief 渲染帧
     */
    void renderFrame();

private:
    /**
     * @brief 渲染游戏画面
     * @param painter 画笔
     * @param data 游戏数据
     * @param size 画面尺寸
     */
    void renderGame(QPainter &painter, const RenderReadyGameData &data, const QSize &size);

    /**
     * @brief 渲染蛇
     * @param painter 画笔
     * @param snakeBody 蛇身体
     * @param cellSize 格子大小
     */
    void renderSnake(QPainter &painter, const QList<QPoint> &snakeBody, int cellSize);

    /**
     * @brief 渲染食物
     * @param painter 画笔
     * @param foods 食物位置
     * @param cellSize 格子大小
     */
    void renderFoods(QPainter &painter, const QList<QPoint> &foods, int cellSize);

    /**
     * @brief 渲染背景网格
     * @param painter 画笔
     * @param size 画面尺寸
     * @param cellSize 格子大小
     */
    void renderGrid(QPainter &painter, const QSize &size, int cellSize);

    /**
     * @brief 渲染地图元素（边界和障碍物）
     * @param painter 画笔
     * @param data 游戏数据
     * @param cellSize 格子大小
     */
    void renderMapElements(QPainter &painter, const RenderReadyGameData &data, int cellSize);

    /**
     * @brief 插值渲染蛇
     * @param painter 画笔
     * @param prev 上一帧蛇身体
     * @param curr 当前帧蛇身体
     * @param cellSize 格子大小
     * @param alpha 插值因子[0,1]
     */
    void renderSnakeInterpolated(QPainter &painter, const QList<QPoint> &prev, const QList<QPoint> &curr, int cellSize, float alpha);

    /**
     * @brief 渲染等待服务器数据的界面
     * @param painter 画笔
     * @param size 画面尺寸
     */
    void renderWaitingScreen(QPainter &painter, const QSize &size);

private:
    QThread *m_thread;                      // 渲染线程
    QTimer *m_renderTimer;                  // 渲染定时器
    
    mutable QMutex m_dataMutex;             // 数据互斥锁
    RenderReadyGameData m_currentData;      // 当前渲染数据
    QSize m_renderSize;                     // 渲染尺寸
    
    mutable QMutex m_cacheMutex;            // 缓存互斥锁
    RenderCache m_renderCache;              // 渲染缓存

    // 双缓冲图像，避免每帧分配与非GUI线程使用 QPixmap
    QImage m_backBuffer;
    QImage m_frontBuffer;

    bool m_running;                         // 是否运行中
    bool m_hasServerState;                  // 是否已收到服务器状态
    int m_currentFPS;                       // 当前FPS
    int m_frameCount;                       // 帧计数
    qint64 m_lastFPSTime;                   // 上次FPS计算时间
    qint64 m_lastRenderTime;                // 上次渲染时间

    static const int TARGET_FPS = 60;       // 目标FPS
};

#endif // RENDERTHREAD_H
